From b1231e1b081f0e41f6c53f689e44f57aad8ddf54 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 10 Aug 2005 14:11:40 +0000 Subject: [PATCH] Fix domain0 builder for PAE. Signed-off-by: Chris Wright Signed-off-by: Keir Fraser --- xen/arch/x86/domain_build.c | 35 ++++++++++++++++++----------------- xen/include/asm-x86/page.h | 3 +++ xen/include/asm-x86/types.h | 7 +++++-- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index d68f4e7602..6e7b022032 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -78,8 +78,8 @@ int construct_dom0(struct domain *d, unsigned long pfn, mfn; unsigned long nr_pages; unsigned long nr_pt_pages; - unsigned long alloc_start; - unsigned long alloc_end; + unsigned long alloc_spfn; + unsigned long alloc_epfn; unsigned long count; struct pfn_info *page = NULL; start_info_t *si; @@ -145,8 +145,8 @@ int construct_dom0(struct domain *d, ((image_len + PAGE_SIZE - 1) >> PAGE_SHIFT); if ( (page = alloc_largest(d, nr_pages)) == NULL ) panic("Not enough RAM for DOM0 reservation.\n"); - alloc_start = page_to_phys(page); - alloc_end = alloc_start + (d->tot_pages << PAGE_SHIFT); + alloc_spfn = page_to_pfn(page); + alloc_epfn = alloc_spfn + d->tot_pages; if ( (rc = parseelfimage(&dsi)) != 0 ) return rc; @@ -166,7 +166,7 @@ int construct_dom0(struct domain *d, return -EINVAL; } if (strstr(dsi.xen_section_string, "SHADOW=translate")) - opt_dom0_translate = 1; + opt_dom0_translate = 1; /* Align load address to 4MB boundary. */ dsi.v_start &= ~((1UL<<22)-1); @@ -215,12 +215,12 @@ int construct_dom0(struct domain *d, #endif } - if ( (v_end - dsi.v_start) > (alloc_end - alloc_start) ) + if ( ((v_end - dsi.v_start) >> PAGE_SHIFT) > (alloc_epfn - alloc_spfn) ) panic("Insufficient contiguous RAM to build kernel image.\n"); printk("PHYSICAL MEMORY ARRANGEMENT:\n" - " Dom0 alloc.: %p->%p", - _p(alloc_start), _p(alloc_end)); + " Dom0 alloc.: %"PRIphysaddr"->%"PRIphysaddr, + pfn_to_phys(alloc_spfn), pfn_to_phys(alloc_epfn)); if ( d->tot_pages < nr_pages ) printk(" (%lu pages to be allocated)", nr_pages - d->tot_pages); @@ -249,7 +249,8 @@ int construct_dom0(struct domain *d, return -ENOMEM; } - mpt_alloc = (vpt_start - dsi.v_start) + alloc_start; + mpt_alloc = (vpt_start - dsi.v_start) + + (unsigned long)pfn_to_phys(alloc_spfn); /* * We're basically forcing default RPLs to 1, so that our "what privilege @@ -306,7 +307,7 @@ int construct_dom0(struct domain *d, #endif l2tab += l2_linear_offset(dsi.v_start); - mfn = alloc_start >> PAGE_SHIFT; + mfn = alloc_spfn; for ( count = 0; count < ((v_end-dsi.v_start)>>PAGE_SHIFT); count++ ) { if ( !((unsigned long)l1tab & (PAGE_SIZE-1)) ) @@ -428,7 +429,7 @@ int construct_dom0(struct domain *d, v->arch.guest_table = mk_pagetable(__pa(l4start)); l4tab += l4_table_offset(dsi.v_start); - mfn = alloc_start >> PAGE_SHIFT; + mfn = alloc_spfn; for ( count = 0; count < ((v_end-dsi.v_start)>>PAGE_SHIFT); count++ ) { if ( !((unsigned long)l1tab & (PAGE_SIZE-1)) ) @@ -563,11 +564,11 @@ int construct_dom0(struct domain *d, /* Write the phys->machine and machine->phys table entries. */ for ( pfn = 0; pfn < d->tot_pages; pfn++ ) { - mfn = pfn + (alloc_start>>PAGE_SHIFT); + mfn = pfn + alloc_spfn; #ifndef NDEBUG #define REVERSE_START ((v_end - dsi.v_start) >> PAGE_SHIFT) if ( !opt_dom0_translate && (pfn > REVERSE_START) ) - mfn = (alloc_end>>PAGE_SHIFT) - (pfn - REVERSE_START); + mfn = alloc_epfn - (pfn - REVERSE_START); #endif ((u32 *)vphysmap_start)[pfn] = mfn; machine_to_phys_mapping[mfn] = pfn; @@ -580,7 +581,7 @@ int construct_dom0(struct domain *d, { mfn = page_to_pfn(page); #ifndef NDEBUG -#define pfn (nr_pages - 1 - (pfn - ((alloc_end - alloc_start) >> PAGE_SHIFT))) +#define pfn (nr_pages - 1 - (pfn - (alloc_epfn - alloc_spfn))) #endif ((u32 *)vphysmap_start)[pfn] = mfn; machine_to_phys_mapping[mfn] = pfn; @@ -620,13 +621,13 @@ int construct_dom0(struct domain *d, if ( opt_dom0_shadow || opt_dom0_translate ) { - printk("dom0: shadow enable\n"); + printk("dom0: shadow enable\n"); shadow_mode_enable(d, (opt_dom0_translate ? SHM_enable | SHM_refcounts | SHM_translate : SHM_enable)); if ( opt_dom0_translate ) { - printk("dom0: shadow translate\n"); + printk("dom0: shadow translate\n"); #if defined(__i386__) && defined(CONFIG_X86_PAE) printk("FIXME: PAE code needed here: %s:%d (%s)\n", __FILE__, __LINE__, __FUNCTION__); @@ -659,7 +660,7 @@ int construct_dom0(struct domain *d, } update_pagetables(v); /* XXX SMP */ - printk("dom0: shadow setup done\n"); + printk("dom0: shadow setup done\n"); } return 0; diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index b4db20bf08..0ac2ab42b0 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -189,6 +189,9 @@ typedef struct { u64 pfn; } pagetable_t; #define virt_to_page(kaddr) (frame_table + (__pa(kaddr) >> PAGE_SHIFT)) #define pfn_valid(_pfn) ((_pfn) < max_page) +#define pfn_to_phys(pfn) ((physaddr_t)(pfn) << PAGE_SHIFT) +#define phys_to_pfn(pa) ((unsigned long)((pa) >> PAGE_SHIFT)) + /* High table entries are reserved by the hypervisor. */ #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) #define DOMAIN_ENTRIES_PER_L2_PAGETABLE \ diff --git a/xen/include/asm-x86/types.h b/xen/include/asm-x86/types.h index fc83052f45..896f6b7164 100644 --- a/xen/include/asm-x86/types.h +++ b/xen/include/asm-x86/types.h @@ -38,13 +38,16 @@ typedef signed long long s64; typedef unsigned long long u64; #if defined(CONFIG_X86_PAE) typedef u64 physaddr_t; +#define PRIphysaddr "016llx" #else -typedef u32 physaddr_t; +typedef unsigned long physaddr_t; +#define PRIphysaddr "08lx" #endif #elif defined(__x86_64__) typedef signed long s64; typedef unsigned long u64; -typedef u64 physaddr_t; +typedef unsigned long physaddr_t; +#define PRIphysaddr "016lx" #endif typedef unsigned long size_t; -- 2.30.2